package admin

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"path"
	"strconv"
	"time"
	. "xm_shop/database"
	. "xm_shop/models"
)

type FocusController struct{}

// 增加轮播图
func (f FocusController) Add(context *gin.Context) {
	// 获取数据
	title := context.PostForm("title")
	focusType, err1 := strconv.Atoi(context.PostForm("focus_type"))
	link := context.PostForm("link")
	sort, err2 := strconv.Atoi(context.PostForm("sort"))
	status, err3 := strconv.Atoi(context.PostForm("status"))
	if err1 != nil || err2 != nil || err3 != nil {
		context.String(http.StatusBadRequest, "参数有误")
		return
	}
	// 获取上传的图片文件
	file, err4 := context.FormFile("focus_img")
	if err4 == nil {
		// 获取文件后缀名  .jpg .png .gif .jpeg
		extName := path.Ext(file.Filename)
		// 创建允许的后缀名的map映射
		allowExtMap := map[string]bool{
			".jpg":  true,
			".jpeg": true,
			".png":  true,
			".gif":  true,
		}
		// 查询文件后缀是否合法
		if _, ok := allowExtMap[extName]; !ok {
			context.String(http.StatusBadRequest, "文件类型不合法")
			return
		}
		// 创建图片保存目录
		day := time.Now().Format("20060102") // 获取当前时间并且格式化
		dir := "./static/upload/" + day      // 指定目录路径 ./static/upload/20030102
		err5 := os.MkdirAll(dir, 0666)       // 递归创建目录, 0666表示所有用户都具有读写权限
		if err5 != nil {
			fmt.Println(err5)
			context.String(http.StatusBadRequest, "目录创建失败")
			return
		}
		// 生成文件名称
		fileName := strconv.FormatInt(time.Now().Unix(), 10) + extName // 使用 strconv.FormatInt 函数将 Unix 时间戳转换为字符串类型，并指定基数为10进制。
		// 执行文件上传
		dst := path.Join(dir, fileName)             // 生成文件路径, 会自动补/
		err6 := context.SaveUploadedFile(file, dst) // 文件保存
		if err6 != nil {
			context.String(http.StatusBadRequest, "文件上传失败")
			return
		}
		// 文件保存成功, 创建对应的数据库记录
		focus := Focus{
			Title:     title,
			FocusType: focusType,
			FocusImg:  dst,
			Link:      link,
			Sort:      sort,
			Status:    status,
			AddTime:   int(time.Now().Unix()),
		}
		if err7 := DB.Create(&focus).Error; err7 != nil { // 执行保存
			context.String(http.StatusBadRequest, "文件保存失败")
			return
		}
		context.String(http.StatusOK, "文件上传成功")
		return
	}
	context.String(http.StatusBadRequest, "文件上传失败")
}

// 获取全部轮播图
func (f FocusController) Index(context *gin.Context) {
	var focusList []Focus
	DB.Find(&focusList)
	context.JSON(http.StatusOK, gin.H{
		"focusList": focusList,
	})
}

// 获取单个轮播图
func (f FocusController) GetOnlyFocus(context *gin.Context) {
	id, err1 := strconv.Atoi(context.Param("id"))
	if err1 != nil {
		context.String(http.StatusBadRequest, "参数有误")
		return
	}
	var focus Focus
	DB.Where("id = ?", id).Take(&focus)
	context.JSON(http.StatusOK, gin.H{
		"focus": focus,
	})
}

// 编辑轮播图
func (f FocusController) Edit(context *gin.Context) {
	id, err1 := strconv.Atoi(context.Param("id"))
	title := context.PostForm("title")
	focusType, err2 := strconv.Atoi(context.PostForm("focus_type"))
	link := context.PostForm("link")
	sort, err3 := strconv.Atoi(context.PostForm("sort"))
	status, err4 := strconv.Atoi(context.PostForm("status"))
	if err1 != nil || err2 != nil || err3 != nil || err4 != nil {
		context.String(http.StatusOK, "参数有误")
		return
	}
	// 处理文件上传
	file, err5 := context.FormFile("focus_img")
	if err5 != nil {
		context.String(http.StatusBadRequest, "文件上传失败")
		return
	}
	fmt.Println(file.Filename)
	// 获取文件后缀
	extName := path.Ext(file.Filename)
	// 创建合法后缀map映射
	allowExtMap := map[string]bool{
		".jpg":  true,
		".jpeg": true,
		".png":  true,
		".gif":  true,
	}
	// 判断文件的合法性
	if _, ok := allowExtMap[extName]; !ok {
		context.String(http.StatusBadRequest, "文件不合法")
		return
	}
	// 获取当前日期
	day := time.Now().Format("20060102")
	// 指定文件存储目录
	dir := "./static/upload/" + day
	// 迭代创建目录
	os.MkdirAll(dir, 0666)
	// 获取当前时间戳的字符串形式
	fileName := strconv.FormatInt(time.Now().Unix(), 10) + extName // 不要忘记拼接后缀
	// 拼接文件路径
	dst := path.Join(dir, fileName)
	err6 := context.SaveUploadedFile(file, dst)
	if err6 != nil {
		context.String(http.StatusBadRequest, "文件保存失败")
		return
	}
	var focus Focus
	DB.Where("id = ?", id).Take(&focus)
	focus.Title = title
	focus.FocusType = focusType
	focus.FocusImg = dst
	focus.Link = link
	focus.Sort = sort
	focus.Status = status
	if err7 := DB.Save(&focus).Error; err7 != nil {
		context.String(http.StatusBadRequest, "修改失败")
		return
	}
	context.JSON(http.StatusOK, gin.H{
		"focus": focus,
	})
}

// 删除轮播图
func (f FocusController) Delete(context *gin.Context) {
	id, err1 := strconv.Atoi(context.Param("id"))
	if err1 != nil {
		context.String(http.StatusBadRequest, "参数有误")
		return
	}
	var focus Focus
	DB.Where("id = ?", id).Take(&focus)
	if err2 := DB.Delete(&focus).Error; err2 != nil {
		context.String(http.StatusBadRequest, "删除失败")
		return
	}
	// 删除指定路径的文件
	//os.Remove("./static/upload/xxx.jpg")
	context.String(http.StatusOK, "删除成功")
}
